home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / earcd / dev / c / asyncio.lha / AsyncIO / src / FGetsLenAsync.c < prev    next >
C/C++ Source or Header  |  1997-02-18  |  1KB  |  86 lines

  1. #include "async.h"
  2.  
  3.  
  4. _LIBCALL APTR
  5. FGetsLenAsync( _REG( a0 ) AsyncFile *file, _REG( a1 ) APTR buf,
  6.     _REG( d0 ) LONG numBytes, _REG( a2 ) LONG *len )
  7. {
  8.     UBYTE    *p = ( UBYTE * ) buf;
  9.     LONG    length = 0;
  10.  
  11.     numBytes -= 2;    /*  room for \n and \0  */
  12.  
  13.     for( ;; )
  14.     {
  15.         UBYTE    *ptr;
  16.         LONG    i, count;
  17.  
  18.         ptr = ( UBYTE * ) file->af_Offset;
  19.  
  20.         if( count = file->af_BytesLeft )
  21.         {
  22.             count = MIN( count, numBytes );
  23.  
  24.             for( i = 0; ( i < count ) && ( *ptr != '\n' ); ++i )
  25.             {
  26.                 *p++ = *ptr++;
  27.             }
  28.  
  29.             length += i;
  30.  
  31.             /* Check for valid EOL char */
  32.             if( i < count )
  33.             {
  34.                 *p++ = '\n';
  35.                 ++i;
  36.                 length += 1;
  37.             }
  38.  
  39.             file->af_BytesLeft -= i;
  40.             file->af_Offset    += i;
  41.  
  42.             if( ( i >= numBytes ) || ( *( p - 1 ) == '\n' ) )
  43.             {
  44.                 *p = '\0';
  45.                 *len = length;
  46.                 return( buf );
  47.             }
  48.  
  49.             numBytes -= i;
  50.         }
  51.  
  52.         if( ReadAsync( file, p, 1 ) < 1 )
  53.         {
  54.             break;
  55.         }
  56.  
  57.         --numBytes;
  58.         ++length;
  59.  
  60.         if( *p++ == '\n' )
  61.         {
  62.             break;
  63.         }
  64.     }
  65.  
  66.     *p = '\0';
  67.     *len = length;
  68.  
  69.     if( p == ( UBYTE * ) buf )
  70.     {
  71.         SetIoErr( file->af_Packet.sp_Pkt.dp_Res2 );
  72.         return( NULL );
  73.     }
  74.  
  75.     return( buf );
  76. }
  77.  
  78.  
  79. _CALL APTR
  80. FGetsAsync( _REG( a0 ) AsyncFile *file, _REG( a1 ) APTR buf, _REG( d0 ) LONG numBytes )
  81. {
  82.     LONG    len;
  83.  
  84.     return( FGetsLenAsync( file, buf, numBytes, &len ) );
  85. }
  86.